home *** CD-ROM | disk | FTP | other *** search
- ##############################################################################
- #
- # Zope Public License (ZPL) Version 1.0
- # -------------------------------------
- #
- # Copyright (c) Digital Creations. All rights reserved.
- #
- # This license has been certified as Open Source(tm).
- #
- # Redistribution and use in source and binary forms, with or without
- # modification, are permitted provided that the following conditions are
- # met:
- #
- # 1. Redistributions in source code must retain the above copyright
- # notice, this list of conditions, and the following disclaimer.
- #
- # 2. Redistributions in binary form must reproduce the above copyright
- # notice, this list of conditions, and the following disclaimer in
- # the documentation and/or other materials provided with the
- # distribution.
- #
- # 3. Digital Creations requests that attribution be given to Zope
- # in any manner possible. Zope includes a "Powered by Zope"
- # button that is installed by default. While it is not a license
- # violation to remove this button, it is requested that the
- # attribution remain. A significant investment has been put
- # into Zope, and this effort will continue if the Zope community
- # continues to grow. This is one way to assure that growth.
- #
- # 4. All advertising materials and documentation mentioning
- # features derived from or use of this software must display
- # the following acknowledgement:
- #
- # "This product includes software developed by Digital Creations
- # for use in the Z Object Publishing Environment
- # (http://www.zope.org/)."
- #
- # In the event that the product being advertised includes an
- # intact Zope distribution (with copyright and license included)
- # then this clause is waived.
- #
- # 5. Names associated with Zope or Digital Creations must not be used to
- # endorse or promote products derived from this software without
- # prior written permission from Digital Creations.
- #
- # 6. Modified redistributions of any form whatsoever must retain
- # the following acknowledgment:
- #
- # "This product includes software developed by Digital Creations
- # for use in the Z Object Publishing Environment
- # (http://www.zope.org/)."
- #
- # Intact (re-)distributions of any official Zope release do not
- # require an external acknowledgement.
- #
- # 7. Modifications are encouraged but must be packaged separately as
- # patches to official Zope releases. Distributions that do not
- # clearly separate the patches from the original work must be clearly
- # labeled as unofficial distributions. Modifications which do not
- # carry the name Zope may be packaged in any form, as long as they
- # conform to all of the clauses above.
- #
- #
- # Disclaimer
- #
- # THIS SOFTWARE IS PROVIDED BY DIGITAL CREATIONS ``AS IS'' AND ANY
- # EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL DIGITAL CREATIONS OR ITS
- # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- # USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- # ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- # OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- # SUCH DAMAGE.
- #
- #
- # This software consists of contributions made by Digital Creations and
- # many individuals on behalf of Digital Creations. Specific
- # attributions are listed in the accompanying credits file.
- #
- ##############################################################################
- __doc__="""Find support"""
- __version__='$Revision: 1.16.20.3 $'[11:-2]
-
-
- import sys, os, string, time, Globals, ExtensionClass
- from DocumentTemplate.DT_Util import Eval, expr_globals
- from AccessControl.Permission import name_trans
- from Globals import HTMLFile
- from DocumentTemplate.DT_Util import InstanceDict, TemplateDict
- from DateTime import DateTime
- from string import find
- from AccessControl import getSecurityManager
-
- class FindSupport(ExtensionClass.Base):
- """Find support for Zope Folders"""
-
- manage_findFrame=HTMLFile('findFrame', globals())
- manage_findForm=HTMLFile('findForm', globals(), management_view='Find')
- manage_findAdv=HTMLFile('findAdv', globals(), management_view='Find',
- help_topic='Find_Advanced.stx',
- help_product='OFSP')
- manage_findResult=HTMLFile('findResult', globals())
-
- __ac_permissions__=(
- ('View management screens',
- ('manage_findFrame', 'manage_findForm', 'manage_findAdv',
- 'manage_findResult')),
- )
-
- manage_options=(
- {'label':'Find', 'action':'manage_findFrame', 'target':'manage_main',
- 'help':('OFSP','Find.stx')},
- )
-
- def ZopeFind(self, obj, obj_ids=None, obj_metatypes=None,
- obj_searchterm=None, obj_expr=None,
- obj_mtime=None, obj_mspec=None,
- obj_permission=None, obj_roles=None,
- search_sub=0,
- REQUEST=None, result=None, pre=''):
- """Zope Find interface"""
-
- if result is None:
- result=[]
-
- if obj_metatypes and 'all' in obj_metatypes:
- obj_metatypes=None
-
- if obj_mtime and type(obj_mtime)==type('s'):
- obj_mtime=DateTime(obj_mtime).timeTime()
-
- if obj_permission:
- obj_permission=p_name(obj_permission)
-
- if obj_roles and type(obj_roles) is type('s'):
- obj_roles=[obj_roles]
-
- if obj_expr:
- # Setup expr machinations
- md=td()
- obj_expr=(Eval(obj_expr, expr_globals), md, md._push, md._pop)
-
- base=obj
- if hasattr(obj, 'aq_base'):
- base=obj.aq_base
-
- if not hasattr(base, 'objectItems'):
- return result
- try: items=obj.objectItems()
- except: return result
-
- try: add_result=result.append
- except:
- raise AttributeError, `result`
-
- for id, ob in items:
- if pre: p="%s/%s" % (pre, id)
- else: p=id
-
- dflag=0
- if hasattr(ob, '_p_changed') and (ob._p_changed == None):
- dflag=1
-
- if hasattr(ob, 'aq_base'):
- bs=ob.aq_base
- else: bs=ob
-
- if (
- (not obj_ids or absattr(bs.id) in obj_ids)
- and
- (not obj_metatypes or (hasattr(bs, 'meta_type') and
- bs.meta_type in obj_metatypes))
- and
- (not obj_searchterm or
- (hasattr(ob, 'PrincipiaSearchSource') and
- find(ob.PrincipiaSearchSource(), obj_searchterm) >= 0
- ))
- and
- (not obj_expr or expr_match(ob, obj_expr))
- and
- (not obj_mtime or mtime_match(ob, obj_mtime, obj_mspec))
- and
- ( (not obj_permission or not obj_roles) or \
- role_match(ob, obj_permission, obj_roles)
- )
- ):
- add_result((p, ob))
- dflag=0
-
- if search_sub and hasattr(bs, 'objectItems'):
- self.ZopeFind(ob, obj_ids, obj_metatypes,
- obj_searchterm, obj_expr,
- obj_mtime, obj_mspec,
- obj_permission, obj_roles,
- search_sub,
- REQUEST, result, p)
- if dflag: ob._p_deactivate()
-
- return result
-
-
-
-
- PrincipiaFind=ZopeFind
-
- def ZopeFindAndApply(self, obj, obj_ids=None, obj_metatypes=None,
- obj_searchterm=None, obj_expr=None,
- obj_mtime=None, obj_mspec=None,
- obj_permission=None, obj_roles=None,
- search_sub=0,
- REQUEST=None, result=None, pre='',
- apply_func=None, apply_path=''):
- """Zope Find interface and apply"""
-
- if result is None:
- result=[]
-
- if obj_metatypes and 'all' in obj_metatypes:
- obj_metatypes=None
-
- if obj_mtime and type(obj_mtime)==type('s'):
- obj_mtime=DateTime(obj_mtime).timeTime()
-
- if obj_permission:
- obj_permission=p_name(obj_permission)
-
- if obj_roles and type(obj_roles) is type('s'):
- obj_roles=[obj_roles]
-
- if obj_expr:
- # Setup expr machinations
- md=td()
- obj_expr=(Eval(obj_expr, expr_globals), md, md._push, md._pop)
-
- base=obj
- if hasattr(obj, 'aq_base'):
- base=obj.aq_base
-
- if not hasattr(base, 'objectItems'):
- return result
- try: items=obj.objectItems()
- except: return result
-
- try: add_result=result.append
- except:
- raise AttributeError, `result`
-
- for id, ob in items:
- if pre: p="%s/%s" % (pre, id)
- else: p=id
-
- dflag=0
- if hasattr(ob, '_p_changed') and (ob._p_changed == None):
- dflag=1
-
- if hasattr(ob, 'aq_base'):
- bs=ob.aq_base
- else: bs=ob
-
- if (
- (not obj_ids or absattr(bs.id) in obj_ids)
- and
- (not obj_metatypes or (hasattr(bs, 'meta_type') and
- bs.meta_type in obj_metatypes))
- and
- (not obj_searchterm or
- (hasattr(ob, 'PrincipiaSearchSource') and
- find(ob.PrincipiaSearchSource(), obj_searchterm) >= 0
- ))
- and
- (not obj_expr or expr_match(ob, obj_expr))
- and
- (not obj_mtime or mtime_match(ob, obj_mtime, obj_mspec))
- and
- ( (not obj_permission or not obj_roles) or \
- role_match(ob, obj_permission, obj_roles)
- )
- ):
- if apply_func:
- apply_func(ob, (apply_path+'/'+p))
- else:
- add_result((p, ob))
- dflag=0
-
- if search_sub and hasattr(bs, 'objectItems'):
- self.ZopeFindAndApply(ob, obj_ids, obj_metatypes,
- obj_searchterm, obj_expr,
- obj_mtime, obj_mspec,
- obj_permission, obj_roles,
- search_sub,
- REQUEST, result, p,
- apply_func, apply_path)
- if dflag: ob._p_deactivate()
-
- return result
-
-
-
-
- class td(TemplateDict):
-
- def validate(self, inst, parent, name, value, md):
- return getSecurityManager().validate(inst, parent, name, value)
-
-
- def expr_match(ob, ed, c=InstanceDict, r=0):
- e, md, push, pop=ed
- push(c(ob, md))
- try: r=e.eval(md)
- finally:
- pop()
- return r
-
-
-
- def mtime_match(ob, t, q, fn=hasattr):
- if not fn(ob, '_p_mtime'):
- return 0
- return q=='<' and (ob._p_mtime < t) or (ob._p_mtime > t)
-
-
- def role_match(ob, permission, roles, lt=type([]), tt=type(())):
- pr=[]
- fn=pr.append
-
- while 1:
- if hasattr(ob, permission):
- p=getattr(ob, permission)
- if type(p) is lt:
- map(fn, p)
- if hasattr(ob, 'aq_parent'):
- ob=ob.aq_parent
- continue
- break
- if type(p) is tt:
- map(fn, p)
- break
- if p is None:
- map(fn, ('Manager', 'Anonymous'))
- break
-
- if hasattr(ob, 'aq_parent'):
- ob=ob.aq_parent
- continue
- break
-
- for role in roles:
- if not (role in pr):
- return 0
- return 1
-
-
- Globals.default__class_init__(FindSupport)
-
- # Helper functions
-
- def absattr(attr):
- if callable(attr): return attr()
- return attr
-
-
- def p_name(name):
- return '_' + string.translate(name, name_trans) + '_Permission'
-
-
-